Android studio调用手机相机拍照显示并保存+读取本地相册并显示 |
您所在的位置:网站首页 › android studio导入图片放到相册中 › Android studio调用手机相机拍照显示并保存+读取本地相册并显示 |
移植深度学习训练好的模型,第一步是可以使用安卓手机的相机进行拍照或者访问相册进行图片选择。第二步,调用模型,进行结果显示。现在记录第一步的代码实现。 我的界面有三个,第一个是MainActivity,第二个是Camera拍照的显示,第三个是Albums的显示。 结构介绍 1.activity_main.xml和MainActivity.java介绍1.1.activity_main.xml代码1.2.MainActivity.java代码及介绍 2.albums.xml和Albums.java介绍以及添加方法介绍2.1.albums.xml代码介绍和添加方法2.2.Albums.java代码介绍和添加方法 3.camera.xml和Camera.java代码介绍及添加方法3.1.camera.xml的添加方法和代码3.2.Camera.java的添加方法和代码 4.在AndroidManifest.xml中添加注册4.1.注册除了MainActivity的其他两个界面,添加provider4.2.申请使用相机的权限,读写 5.添加图片保存的xml路径,添加方法和内容点击运行,可以在虚拟设备上运行了运行或安装的问题总结续上次的程序总结 1.activity_main.xml和MainActivity.java介绍 1.1.activity_main.xml代码首先是activity_main.xml,主要有3个控件,但是第三个ImageView控件这里没有使用,界面图下图所示 MainActivity.java代码如下所示:我的主界面主要功能比较简单,就是在拍照和相册按钮中添加响应,然后跳转到相应的显示界面 package com.example.mycamera; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class MainActivity extends AppCompatActivity { public static final int TAKE_PHOTO = 1; public static final int CHOOSE_PHOTO = 2; private ImageView picture; private Intent intent1,intent2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button chooseFromAlbum = findViewById(R.id.choose_from_album); chooseFromAlbum.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, CHOOSE_PHOTO); } else { openAlbum();//打开album的界面 } } }); Button takePhoto = findViewById(R.id.take_photo); picture = findViewById(R.id.picture); takePhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 动态申请权限 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, TAKE_PHOTO); } else { // 启动相机程序 startCamera(); } } }); intent1=new Intent(this,Albums.class);//创建跳转到Albums显示的窗口的Intent intent2=new Intent(this,Camera.class);//创建跳转到Camera显示的窗口的Intent } private void openAlbum() { startActivity(intent1);//进入album的窗口界面 } private void startCamera() { startActivity(intent2);//进入camera的窗口界面 //Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); // 指定图片的输出地址为imageUri //mPhotoPath = getSDPath()+"/"+ getPhotoFileName();//设置图片文件路径,getSDPath()和getPhotoFileName()具体实现在下面 //intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //startActivityForResult(intent, TAKE_PHOTO); } } 2.albums.xml和Albums.java介绍以及添加方法介绍albums界面的功能就是在MainActivity点击相册按钮时,查找本地的相册,然后显示选择的picture到ImageView控件,图片检测功能未添加,因为还没有载入模型,图片保存就是将ImageView控件中的图片保存到本地中。 2.1.albums.xml代码介绍和添加方法添加方法如下图所示 ![]() 添加方法如下所示,步骤1,2,3,然后修改名称为Albums即可 camera界面的功能就是在MainActivity点击拍照按钮时,调用本地摄像机,将拍的照片显示到ImageView控件,图片检测功能未添加,因为还没有载入模型,图片保存就是将ImageView控件中的图片保存到本地中。 camera.xml的添加方法和界面和2.1中的album.xml一样 camera.xml代码如下: 3.2.Camera.java的添加方法和代码Camera.java的添加方法和界面和 2.2中的Album.java一样 Camera.java代码如下: package com.example.mycamera; import android.Manifest; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.core.content.FileProvider; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Camera extends Activity { private ImageView cameraPicture; public static final int TAKE_PHOTO = 1; private Button pestDection=null; private Button pictureSave=null; private Intent intent3; private Uri imageUri; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.albums); pestDection=super.findViewById(R.id.pestDetection); pictureSave=super.findViewById(R.id.pictureSave); cameraPicture = super.findViewById(R.id.picture); // 创建一个File对象,用于保存摄像头拍下的图片,这里把图片命名为output_image.jpg // 并将它存放在手机SD卡的应用关联缓存目录下 File outputImage = new File(getExternalCacheDir(), "output_image.jpg"); // 对照片的更换设置 try { // 如果上一次的照片存在,就删除 if (outputImage.exists()) { outputImage.delete(); } // 创建一个新的文件 outputImage.createNewFile(); } catch (IOException e) { e.printStackTrace(); } // 如果Android版本大于等于7.0 if (Build.VERSION.SDK_INT >= 24) { // 将File对象转换成一个封装过的Uri对象 imageUri = FileProvider.getUriForFile(this, "com.example.lenovo.cameraalbumtest.fileprovider", outputImage); Log.d("MainActivity", outputImage.toString() + "手机系统版本高于Android7.0"); } else { // 将File对象转换为Uri对象,这个Uri标识着output_image.jpg这张图片的本地真实路径 Log.d("MainActivity", outputImage.toString() + "手机系统版本低于Android7.0"); imageUri = Uri.fromFile(outputImage); } // 动态申请权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.CAMERA}, TAKE_PHOTO); } else { // 启动相机程序 startCamera(); } intent3 = new Intent(getApplicationContext(),MainActivity.class); pestDection.setOnClickListener(new Camera.pestDectionFuntion()); pictureSave.setOnClickListener(new Camera.pictureSaveFunction()); } private void startCamera() { Intent intent4 = new Intent("android.media.action.IMAGE_CAPTURE"); // 指定图片的输出地址为imageUri intent4.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent4, TAKE_PHOTO); } private class pestDectionFuntion implements View.OnClickListener { public void onClick(View view){ Toast.makeText(getApplicationContext(),"粮虫检测",Toast.LENGTH_SHORT).show(); } } private class pictureSaveFunction implements View.OnClickListener { public void onClick(View view){ BitmapDrawable bmpDrawable = (BitmapDrawable) cameraPicture.getDrawable(); Bitmap bitmap = bmpDrawable.getBitmap(); saveToSystemGallery(bitmap);//将图片保存到本地 Toast.makeText(getApplicationContext(),"图片保存成功!",Toast.LENGTH_SHORT).show(); startActivity(intent3);//窗口切换 } } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { switch (requestCode) { case TAKE_PHOTO: if (requestCode == TAKE_PHOTO && resultCode == RESULT_OK ) { try { // 将图片解析成Bitmap对象 Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); cameraPicture.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } break; default: break; } } public void saveToSystemGallery(Bitmap bmp) { // 首先保存图片 File appDir = new File(Environment.getExternalStorageDirectory(), "Mycamera"); if (!appDir.exists()) { appDir.mkdir(); } String fileName = System.currentTimeMillis() + ".jpg"; File file = new File(appDir, fileName); try { FileOutputStream fos = new FileOutputStream(file); bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 其次把文件插入到系统图库 try { MediaStore.Images.Media.insertImage(getContentResolver(), file.getAbsolutePath(), fileName, null); } catch (FileNotFoundException e) { e.printStackTrace(); } //sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(file.getAbsolutePath()))); Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri uri = Uri.fromFile(file); intent.setData(uri); sendBroadcast(intent);// 发送广播,通知图库更新 } } 4.在AndroidManifest.xml中添加注册 4.1.注册除了MainActivity的其他两个界面,添加provider内容如下:
新建xml目录,方法如下: ![]() 然后就可以开心的运行了! 续上次的程序实际运行中,发现点击图像保存按钮时,图库中会出现两种一模一样的图片,将以下代码屏蔽,即可解决这个问题。 // 其次把文件插入到系统图库 /* try { MediaStore.Images.Media.insertImage(getContentResolver(), file.getAbsolutePath(), fileName, null); } catch (FileNotFoundException e) { e.printStackTrace(); }*/ 总结深度检测模型的移动端移植,第一步访问本地相册,或者使用相机进行拍照的功能已经完成,离成功又近了一步,加油自己! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |